using System.Reflection;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.Filters;

namespace PowerManage.API.Extensions;

/// <summary>
/// SwaggerGen相关扩展
/// </summary>
public static class SwaggerGenExtension
{
    /// <summary>
    /// Swagger/OpenAPI自定义扩展
    /// </summary>
    /// <param name="builder"></param>
    public static void AddPowerManageSwaggerGen(this WebApplicationBuilder builder)
    {
        builder.Services.AddEndpointsApiExplorer();
        builder.Services.AddSwaggerGen(options =>
        {
            // 添加 Swagger 文档
            options.SwaggerDoc("v1", new OpenApiInfo
            {
                Title = "PowerManage API",
                Version = "v1",
                Description = "PowerManage API Is ASP.NET Core Web API",
            });
            //开启加权小锁
            options.OperationFilter<AddResponseHeadersFilter>(); //向Swagger文档中动态添加自定义响应头信息
            options.OperationFilter<AppendAuthorizeToSummaryOperationFilter>(); //用于在每个API操作的摘要中追加授权信息
            //在Header中添加token传递到后台
            options.OperationFilter<SecurityRequirementsOperationFilter>(); //在每个API操作中动态地添加安全要求信息
            //定义jwt授权的安全方案
            options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme()
            {
                Description = "JWT授权(通过请求头中携带Token) 直接在下框中输入Bearer {token}(注意两者中间有空格)",
                Name = "Authorization", //安全方案的名称
                In = ParameterLocation.Header, //安全方案的位置: jwt默认存放Autorization信息的位置（header中）
                Type = SecuritySchemeType.ApiKey //安全方案的类型: API密钥类型
            });

            //为Swagger设置xml文档注释路径
            var xmlFile =
                $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; //获取当前正在执行的程序集（assembly）的名称，并将其拼接成XML文件名
            var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); //将基本目录和XML文件名组合成完整的文件路径
            //添加控制器层注释，true表示显示控制器注释
            options.IncludeXmlComments(xmlPath, true); //将指定路径的XML注释文件包含到Swagger文档中
        });
    }
}